package thread.test2;

import org.junit.Test;

/**
 * suspend方法已经不推荐使用，因为suspend容易导致线程死锁。
 * <p>
 * 简单分析一下 suspend和sleep的区别
 * <p>
 * 虽然suspend和sleep都可以导致线程等待，而且两个方法都不会释放已经持有的监视器（锁），但是为什么suspend更容易导致死锁的发生呢？
 * <p>
 * suspend方法可以在线程外部调用，无论当前线程执行到什么代码都会被叫停，这就引发了区别，因为sleep只能暂停当前线程，也就是说只能在线程内部显示的暂停，这个时候线程持有哪些对象锁是明确知道的。
 * <p>
 * 但是如果调用suspend那么线程对于我们来说就是一个黑匣子，它运行到哪里，当前持有什么对象锁，这些锁在后面的代码中是否需要都不知道，这就很可能在一些关键资源上被一直持有不能释放从而导致死锁。
 * <p>
 * 如最常见的 System.out.println()方法 这个方法就是被synchronize修饰的，如果线程在执行 System.out.println()时被调用suspend暂停，后续的代码中如果在调用 System.out.println()就会进入死锁。
 */
public class SuspendMethodTest extends Thread {

    private long i = 0;

    @Override
    public void run() {

        while (true) {
            System.out.println(i);
            i++;
        }

    }


    @Test
    public void testSuspend() throws InterruptedException {
        SuspendMethodTest myThread = new SuspendMethodTest();
        myThread.start();
        Thread.sleep(1000);
        myThread.suspend();
        System.out.println("main end");
        System.out.println("main end");
        System.out.println("main end");
        System.out.println("main end");
        System.out.println("main end");

        myThread.resume();

    }


}
